package main

import "fmt"

type Animal interface {
	Eat(food string)
	Sleep(time int)
	Life() string
	Like(thing string) // 修改参数名，与实现保持一致
	Name()
}

type Cat struct {
	name string
	age  int
	like string
}

// 所有方法都使用指针接收者
func (cat *Cat) Eat(food string) {
	fmt.Printf("小猫-%s 爱吃>%s \n", cat.name, food)
}

func (cat *Cat) Sleep(time int) {
	if cat.age > 18 {
		fmt.Printf("小猫-%s 今年>%d岁 睡了%d小时\n", cat.name, cat.age, time)
	} else {
		fmt.Printf("小猫-%s 今年才%d岁 未成年要睡%d小时\n", cat.name, cat.age, time+3)
	}
}

func (cat *Cat) Life() string {
	return "小猫住在主人家"
}

func (cat *Cat) Like(thing string) { // 修改为指针接收者并添加参数
	fmt.Printf("%s喜欢%s \n", cat.name, thing)
}

func (cat *Cat) Name() {
	fmt.Printf("名字: %s\n", cat.name)
}

func main() {
	// 使用指针实例化 --> 接口方法用指针类型接收则使用指针实例化
	cat := &Cat{name: "Tom", age: 9, like: "抓老鼠"}
	/* 值实例化 */
	//cat2 := Cat{name: "Tom", age: 9, like: "抓老鼠"}

	// 通过指针调用所有方法
	cat.Name()
	cat.Eat("鱼")
	cat.Sleep(5)
	fmt.Println(cat.Life())

	cat.Like(cat.like) // 使用结构体字段
	cat.Like("熬夜")     // 直接传入参数

	cat.like = "晒太阳"   // 修改属性
	cat.Like(cat.like) // 验证修改

	cat.name = "Any" // 修改名字
	cat.Name()       // 验证修改

	// 通过接口调用（验证接口实现）
	var animal Animal = cat // 现在*Cat完全实现了Animal接口
	animal.Eat("猫粮")
	animal.Like("玩毛线球")
}
